package controlleur;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import annuaire.beans.Promotion;
import annuaire.exceptions.BusinessException;
import annuaire.rmi.remotedObject.IRemotedAnnuaire;

/**
 * Contrôleur responsable de la description de la page d'accueil
 * 
 * @author Yannick Lorenzati & Stephanie Malakian
 * 
 */
public class HomeControlleur implements Controller {

	/** Logger pour cette classe ainsi que pour ses sous classes */
	protected final Log logger = LogFactory.getLog(getClass());

	/**
	 * Reference vers l'objet distant Annuaire
	 */
	private IRemotedAnnuaire remotedAnnuaire;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet
	 * .http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException,
			BusinessException {

		Map<String, Object> myModel = new HashMap<String, Object>();

		Collection<Integer> listIdPromo = remotedAnnuaire.findAllPromosId();
		Collection<Promotion> listPromo = new ArrayList<Promotion>();
		SortedSet<String> listAnneesPromo = new TreeSet<String>();
		List<String> sortedAnneesPromo = new ArrayList<String>();

		for (Integer id : listIdPromo) {
			listPromo.add(remotedAnnuaire.findPromoById(id, false));

		}
		// Pour ne pas recuperer plusieurs fois la meme annee on utilise un
		// treeset (qui trie par ordre croissant)
		for (Promotion i : listPromo) {
			listAnneesPromo.add(i.getPromoYear());
		}
		// On recupere ca dans une collection et on fait un reverseSort
		for (String annee : listAnneesPromo) {
			sortedAnneesPromo.add(annee);
		}
		Collections.sort(sortedAnneesPromo, Collections.reverseOrder());

		String urlPromoDesc = "promoDescription.htm#promo-";

		myModel.put("listanneespromo", sortedAnneesPromo);

		myModel.put("listpromotion", listPromo);
		myModel.put("url", urlPromoDesc);

		logger.info("Returning home view");
		return new ModelAndView("home", "model", myModel);
	}

	/**
	 * @param remotedAnnuaire
	 *            the remotedAnnuaire to set
	 */
	public void setRemotedAnnuaire(IRemotedAnnuaire remotedAnnuaire) {
		this.remotedAnnuaire = remotedAnnuaire;
	}

	/**
	 * @return the remotedAnnuaire
	 */
	public IRemotedAnnuaire getRemotedAnnuaire() {
		return remotedAnnuaire;
	}
}